Import Dataset and create working dataset:
#install.packages("plotly")
library(plotly)
package 㤼㸱plotly㤼㸲 was built under R version 4.0.4Loading required package: ggplot2
Learn more about the underlying theory at https://ggplot2-book.org/
Registered S3 method overwritten by 'data.table':
method from
print.data.table
Registered S3 method overwritten by 'htmlwidgets':
method from
print.htmlwidget tools:rstudio
Attaching package: 㤼㸱plotly㤼㸲
The following object is masked from 㤼㸱package:ggplot2㤼㸲:
last_plot
The following object is masked from 㤼㸱package:stats㤼㸲:
filter
The following object is masked from 㤼㸱package:graphics㤼㸲:
layout
library(reshape2)
package 㤼㸱reshape2㤼㸲 was built under R version 4.0.3
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
method from
print.tbl_lazy
print.tbl_sql
-- Attaching packages --------------------------------------------------------------------------------------------------------------------------------------------- tidyverse 1.3.0 --
v tibble 3.0.3 v dplyr 1.0.2
v tidyr 1.1.2 v stringr 1.4.0
v readr 1.3.1 v forcats 0.5.0
v purrr 0.3.4
-- Conflicts ------------------------------------------------------------------------------------------------------------------------------------------------ tidyverse_conflicts() --
x dplyr::filter() masks plotly::filter(), stats::filter()
x dplyr::lag() masks stats::lag()
games <- read.csv("../../data/vgsales.csv")
game_melt <- melt(data=games,id.vars = c("Rank","Name","Platform","Year","Genre","Publisher"),measure.vars=c("NA_Sales","EU_Sales","JP_Sales","Other_Sales","Global_Sales"))
game_melt$Year <- as.integer(game_melt$Year)
NAs introduced by coercion
colnames(game_melt)[7] <- "Region"
colnames(game_melt)[8] <- "Copies Sold"
head(game_melt)
Graph time baby!
#Number of Copies Sold
graph1 <- game_melt %>%
filter(Region == "NA_Sales") %>%
group_by(Region,Year,Genre) %>%
summarise("Copies Sold" = sum(`Copies Sold`)) %>%
ggplot() +
aes(x=Year,
y=`Copies Sold`,
fill = Genre) +
geom_bar(stat="identity")+
theme(axis.text.x = element_text(angle = 90, hjust=0.95, vjust=0.2)) +
ylab("Number of Copies Sold (in millions)")
`summarise()` regrouping output by 'Region', 'Year' (override with `.groups` argument)
ggplotly(graph1)
Removed 12 rows containing missing values (position_stack).
#Number Releases
graph2 <- game_melt %>%
filter(Region == "NA_Sales") %>%
group_by(Region,Year,Genre) %>%
count(Genre) %>%
rename(`Number of Releases`="n")%>%
ggplot() +
aes(x=Year,
y=`Number of Releases`,
fill = Genre) +
geom_bar(stat="identity")+
theme(axis.text.x = element_text(angle = 90, hjust=0.95, vjust=0.2))+
ylab("Number of Games Released")
ggplotly(graph2)
Removed 12 rows containing missing values (position_stack).
is.list(y)
[1] TRUE
testfxc1 <-function(reg,plat,gen,pub,years) {
# Input: List of Regions, Platforms, Genres, Publishers, Min and Max Year
# Output: Graph
#
# Create subset based on filters
# Pass to graph
# Output graph
if ("Global_Sales" %in% reg){
filter_region = list("Global_Sales")
} else {
filter_region = reg
}
if ("all" %in% plat){
filter_plat = unique(game_melt$Platform)
} else {
filter_plat = plat
}
if ("all" %in% gen){
filter_gen = unique(game_melt$Genre)
} else {
filter_gen = gen
}
if ("all" %in% pub){
filter_pub = unique(game_melt$Publisher)
} else {
filter_pub = pub
}
min_year = years[1]
max_year = years[2]
graph1 <- game_melt[,3:8] %>%
subset(Region %in% filter_region & Platform %in% filter_plat & Genre %in% filter_gen & Publisher %in% filter_pub & Year >= min_year & Year <= max_year) %>%
group_by(Year,Genre) %>%
summarise("Copies Sold" = sum(`Copies Sold`)) %>%
ggplot() +
aes(x=as.factor(Year),
y=`Copies Sold`,
fill = Genre) +
geom_bar(stat="identity")+
theme(axis.text.x = element_text(angle = 90, hjust=0.95, vjust=0.2)) +
ylab("Total Game Copies Sold (in millions)")
return (ggplotly(graph1))
}
testfxc2 <-function(reg,plat,gen,pub,years) {
# Input: List of Regions, Platforms, Genres, Publishers, Min and Max Year
# Output: Graph
#
# Create subset based on filters
# Pass to graph
# Output graph
if ("Global_Sales" %in% reg){
filter_region = list("Global_Sales")
} else {
filter_region = reg
}
if ("all" %in% plat){
filter_plat = unique(game_melt$Platform)
} else {
filter_plat = plat
}
if ("all" %in% gen){
filter_gen = unique(game_melt$Genre)
} else {
filter_gen = gen
}
if ("all" %in% pub){
filter_pub = unique(game_melt$Publisher)
} else {
filter_pub = pub
}
min_year = years[1]
max_year = years[2]
graph2 <- game_melt[,3:8] %>%
subset(Region %in% filter_region & Platform %in% filter_plat & Genre %in% filter_gen & Publisher %in% filter_pub & Year >= min_year & Year <= max_year) %>%
group_by(Year,Genre) %>%
count(Year,Genre) %>%
rename(`Number of Releases`="n") %>%
ggplot() +
aes(x=as.factor(Year),
y=`Number of Releases`,
fill = Genre) +
geom_bar(stat="identity")+
theme(axis.text.x = element_text(angle = 90, hjust=0.95, vjust=0.2))+
ylab("Number of Games Released")
return (ggplotly(graph2))
}
filter_region = list("JP_Sales")
filter_plat = list("N64")
filter_gen = unique(game_melt$Genre)
filter_pub = unique(game_melt$Publisher)
min_year = 1980
max_year = 1990
test <- game_melt %>%
subset(Region %in% filter_region & Platform %in% filter_plat & Genre %in% filter_gen & Publisher %in% filter_pub & Year >= min_year & Year <= max_year)
dim(test)
[1] 0 8
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KSW1wb3J0IERhdGFzZXQgYW5kIGNyZWF0ZSB3b3JraW5nIGRhdGFzZXQ6DQpgYGB7cn0NCiNpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHJlc2hhcGUyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpnYW1lcyA8LSByZWFkLmNzdigiLi4vLi4vZGF0YS92Z3NhbGVzLmNzdiIpDQpnYW1lX21lbHQgPC0gbWVsdChkYXRhPWdhbWVzLGlkLnZhcnMgPSBjKCJSYW5rIiwiTmFtZSIsIlBsYXRmb3JtIiwiWWVhciIsIkdlbnJlIiwiUHVibGlzaGVyIiksbWVhc3VyZS52YXJzPWMoIk5BX1NhbGVzIiwiRVVfU2FsZXMiLCJKUF9TYWxlcyIsIk90aGVyX1NhbGVzIiwiR2xvYmFsX1NhbGVzIikpDQpnYW1lX21lbHQkWWVhciA8LSBhcy5pbnRlZ2VyKGdhbWVfbWVsdCRZZWFyKQ0KY29sbmFtZXMoZ2FtZV9tZWx0KVs3XSA8LSAiUmVnaW9uIg0KY29sbmFtZXMoZ2FtZV9tZWx0KVs4XSA8LSAiQ29waWVzIFNvbGQiDQpoZWFkKGdhbWVfbWVsdCkNCmBgYA0KR3JhcGggdGltZSBiYWJ5IQ0KYGBge3J9DQojTnVtYmVyIG9mIENvcGllcyBTb2xkDQpncmFwaDEgPC0gZ2FtZV9tZWx0ICU+JSANCiAgICBmaWx0ZXIoUmVnaW9uID09ICJOQV9TYWxlcyIpICU+JQ0KICAgIGdyb3VwX2J5KFJlZ2lvbixZZWFyLEdlbnJlKSAlPiUNCiAgICBzdW1tYXJpc2UoIkNvcGllcyBTb2xkIiA9IHN1bShgQ29waWVzIFNvbGRgKSkgJT4lIA0KICAgIGdncGxvdCgpICsNCiAgICBhZXMoeD1ZZWFyLA0KICAgICAgICB5PWBDb3BpZXMgU29sZGAsDQogICAgICAgIGZpbGwgPSBHZW5yZSkgKyANCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0PTAuOTUsIHZqdXN0PTAuMikpICsNCiAgICB5bGFiKCJOdW1iZXIgb2YgQ29waWVzIFNvbGQgKGluIG1pbGxpb25zKSIpDQogICAgDQpnZ3Bsb3RseShncmFwaDEpDQpgYGANCg0KYGBge3J9DQojTnVtYmVyIFJlbGVhc2VzDQpncmFwaDIgPC0gZ2FtZV9tZWx0ICU+JSANCiAgICBmaWx0ZXIoUmVnaW9uID09ICJOQV9TYWxlcyIpICU+JQ0KICAgIGdyb3VwX2J5KFJlZ2lvbixZZWFyLEdlbnJlKSAlPiUNCiAgICBjb3VudChHZW5yZSkgJT4lDQogICAgcmVuYW1lKGBOdW1iZXIgb2YgUmVsZWFzZXNgPSJuIiklPiUgDQogICAgZ2dwbG90KCkgKw0KICAgIGFlcyh4PVllYXIsDQogICAgICAgIHk9YE51bWJlciBvZiBSZWxlYXNlc2AsDQogICAgICAgIGZpbGwgPSBHZW5yZSkgKyANCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0PTAuOTUsIHZqdXN0PTAuMikpKw0KICAgIHlsYWIoIk51bWJlciBvZiBHYW1lcyBSZWxlYXNlZCIpDQpnZ3Bsb3RseShncmFwaDIpDQpgYGANCmBgYHtyfQ0KI051bWJlciBvZiBQbGF0Zm9ybXMsIEdlbnJlcyBhbmQgUHVibGlzaGVycyB3aXRoIGdhbWVzID4gMTAwIGNvcGllcyBzb2xkIA0KZ3JhcGgzIDwtIGdhbWVfbWVsdCAlPiUgDQogICAgZmlsdGVyKFJlZ2lvbiA9PSAiSlBfU2FsZXMiKSAlPiUNCiAgICBncm91cF9ieShZZWFyKSU+JQ0KICAgIG1lbHQoaWQudmFycz1jKCJZZWFyIiksbWVhc3VyZS52YXJzPWMoIkdlbnJlIiwiUGxhdGZvcm0iLCJQdWJsaXNoZXIiKSkgJT4lDQogICAgcmVuYW1lKENhdGVnb3J5PSd2YXJpYWJsZScpICU+JSANCiAgICBncm91cF9ieShZZWFyLENhdGVnb3J5KSAlPiUNCiAgICB1bmlxdWUoKSAlPiUNCiAgICBjb3VudChZZWFyLENhdGVnb3J5KSAlPiUNCiAgICByZW5hbWUoYENvdW50cyBvZiBHZW5yZXMsIFB1Ymxpc2hlcnMgYW5kIFBsYXRmb3Jtc2A9IG4pICU+JSANCiAgICBnZ3Bsb3QoKSArDQogICAgYWVzKHg9WWVhciwNCiAgICAgICAgeT1gQ291bnRzIG9mIEdlbnJlcywgUHVibGlzaGVycyBhbmQgUGxhdGZvcm1zYCwNCiAgICAgICAgZmlsbCA9IENhdGVnb3J5KSArIA0KICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3Q9MC45NSwgdmp1c3Q9MC4yKSkrDQogICAgeWxhYigiQ291bnRzIG9mIEdlbnJlcywgUHVibGlzaGVycyBhbmQgUGxhdGZvcm1zIikNCmdncGxvdGx5KGdyYXBoMykNCng8LTENCnk8LWxpc3QoeCkNCmlzLmxpc3QoeSkNCmBgYA0KDQpgYGB7cn0NCnRlc3RmeGMxIDwtZnVuY3Rpb24ocmVnLHBsYXQsZ2VuLHB1Yix5ZWFycykgew0KICAgICAgICAgIyBJbnB1dDogTGlzdCBvZiBSZWdpb25zLCBQbGF0Zm9ybXMsIEdlbnJlcywgUHVibGlzaGVycywgTWluIGFuZCBNYXggWWVhcg0KICAgICAgICAgIyBPdXRwdXQ6IEdyYXBoDQogICAgICAgICAjDQogICAgICAgICAjIENyZWF0ZSBzdWJzZXQgYmFzZWQgb24gZmlsdGVycyANCiAgICAgICAgICMgUGFzcyB0byBncmFwaA0KICAgICAgICAgIyBPdXRwdXQgZ3JhcGgNCiAgICAgICAgaWYgKCJHbG9iYWxfU2FsZXMiICVpbiUgcmVnKXsNCiAgICAgICAgICAgIGZpbHRlcl9yZWdpb24gPSBsaXN0KCJHbG9iYWxfU2FsZXMiKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZmlsdGVyX3JlZ2lvbiA9IHJlZw0KICAgICAgICB9DQogICAgICAgICBpZiAoImFsbCIgJWluJSBwbGF0KXsNCiAgICAgICAgICAgICBmaWx0ZXJfcGxhdCA9IHVuaXF1ZShnYW1lX21lbHQkUGxhdGZvcm0pDQogICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIGZpbHRlcl9wbGF0ID0gcGxhdA0KICAgICAgICAgfQ0KICAgICAgICAgaWYgKCJhbGwiICVpbiUgZ2VuKXsNCiAgICAgICAgICAgICBmaWx0ZXJfZ2VuID0gdW5pcXVlKGdhbWVfbWVsdCRHZW5yZSkNCiAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgZmlsdGVyX2dlbiA9IGdlbg0KICAgICAgICAgfQ0KICAgICAgICAgaWYgKCJhbGwiICVpbiUgcHViKXsNCiAgICAgICAgICAgICBmaWx0ZXJfcHViID0gdW5pcXVlKGdhbWVfbWVsdCRQdWJsaXNoZXIpDQogICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIGZpbHRlcl9wdWIgPSBwdWINCiAgICAgICAgIH0NCiAgICAgICAgIG1pbl95ZWFyID0geWVhcnNbMV0NCiAgICAgICAgIG1heF95ZWFyID0geWVhcnNbMl0NCiAgICAgICAgIA0KICAgICAgICAgZ3JhcGgxIDwtIGdhbWVfbWVsdFssMzo4XSAlPiUgDQogICAgICAgICAgICAgc3Vic2V0KFJlZ2lvbiAlaW4lIGZpbHRlcl9yZWdpb24gJiBQbGF0Zm9ybSAlaW4lIGZpbHRlcl9wbGF0ICYgR2VucmUgJWluJSBmaWx0ZXJfZ2VuICYgUHVibGlzaGVyICVpbiUgZmlsdGVyX3B1YiAmIFllYXIgPj0gbWluX3llYXIgJiBZZWFyIDw9IG1heF95ZWFyKSAlPiUNCiAgICAgICAgICAgICBncm91cF9ieShZZWFyLEdlbnJlKSAlPiUNCiAgICAgICAgICAgICBzdW1tYXJpc2UoIkNvcGllcyBTb2xkIiA9IHN1bShgQ29waWVzIFNvbGRgKSkgJT4lIA0KICAgICAgICAgICAgIGdncGxvdCgpICsNCiAgICAgICAgICAgICBhZXMoeD1hcy5mYWN0b3IoWWVhciksDQogICAgICAgICAgICAgICAgIHk9YENvcGllcyBTb2xkYCwNCiAgICAgICAgICAgICAgICAgZmlsbCA9IEdlbnJlKSArIA0KICAgICAgICAgICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrDQogICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3Q9MC45NSwgdmp1c3Q9MC4yKSkgKw0KICAgICAgICAgICAgIHlsYWIoIlRvdGFsIEdhbWUgQ29waWVzIFNvbGQgKGluIG1pbGxpb25zKSIpDQogICAgICAgICANCiAgICAgICAgIHJldHVybiAoZ2dwbG90bHkoZ3JhcGgxKSkNCn0NCg0KdGVzdGZ4YzIgPC1mdW5jdGlvbihyZWcscGxhdCxnZW4scHViLHllYXJzKSB7DQogICAgICAgICMgSW5wdXQ6IExpc3Qgb2YgUmVnaW9ucywgUGxhdGZvcm1zLCBHZW5yZXMsIFB1Ymxpc2hlcnMsIE1pbiBhbmQgTWF4IFllYXINCiAgICAgICAgIyBPdXRwdXQ6IEdyYXBoDQogICAgICAgICMNCiAgICAgICAgIyBDcmVhdGUgc3Vic2V0IGJhc2VkIG9uIGZpbHRlcnMgDQogICAgICAgICMgUGFzcyB0byBncmFwaA0KICAgICAgICAjIE91dHB1dCBncmFwaA0KICAgICAgICBpZiAoIkdsb2JhbF9TYWxlcyIgJWluJSByZWcpew0KICAgICAgICAgICAgZmlsdGVyX3JlZ2lvbiA9IGxpc3QoIkdsb2JhbF9TYWxlcyIpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmaWx0ZXJfcmVnaW9uID0gcmVnDQogICAgICAgIH0NCiAgICAgICAgaWYgKCJhbGwiICVpbiUgcGxhdCl7DQogICAgICAgICAgICBmaWx0ZXJfcGxhdCA9IHVuaXF1ZShnYW1lX21lbHQkUGxhdGZvcm0pDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmaWx0ZXJfcGxhdCA9IHBsYXQNCiAgICAgICAgfQ0KICAgICAgICBpZiAoImFsbCIgJWluJSBnZW4pew0KICAgICAgICAgICAgZmlsdGVyX2dlbiA9IHVuaXF1ZShnYW1lX21lbHQkR2VucmUpDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmaWx0ZXJfZ2VuID0gZ2VuDQogICAgICAgIH0NCiAgICAgICAgaWYgKCJhbGwiICVpbiUgcHViKXsNCiAgICAgICAgICAgIGZpbHRlcl9wdWIgPSB1bmlxdWUoZ2FtZV9tZWx0JFB1Ymxpc2hlcikNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGZpbHRlcl9wdWIgPSBwdWINCiAgICAgICAgfQ0KICAgICAgICBtaW5feWVhciA9IHllYXJzWzFdDQogICAgICAgIG1heF95ZWFyID0geWVhcnNbMl0NCiAgICAgICAgDQogICAgICAgIGdyYXBoMiA8LSBnYW1lX21lbHRbLDM6OF0gJT4lIA0KICAgICAgICAgICAgc3Vic2V0KFJlZ2lvbiAlaW4lIGZpbHRlcl9yZWdpb24gJiBQbGF0Zm9ybSAlaW4lIGZpbHRlcl9wbGF0ICYgR2VucmUgJWluJSBmaWx0ZXJfZ2VuICYgUHVibGlzaGVyICVpbiUgZmlsdGVyX3B1YiAmIFllYXIgPj0gbWluX3llYXIgJiBZZWFyIDw9IG1heF95ZWFyKSAlPiUNCiAgICAgICAgICAgIGdyb3VwX2J5KFllYXIsR2VucmUpICU+JQ0KICAgICAgICAgICAgY291bnQoWWVhcixHZW5yZSkgJT4lDQogICAgICAgICAgICByZW5hbWUoYE51bWJlciBvZiBSZWxlYXNlc2A9Im4iKSAlPiUgDQogICAgICAgICAgICBnZ3Bsb3QoKSArDQogICAgICAgICAgICBhZXMoeD1hcy5mYWN0b3IoWWVhciksDQogICAgICAgICAgICAgICAgeT1gTnVtYmVyIG9mIFJlbGVhc2VzYCwNCiAgICAgICAgICAgICAgICBmaWxsID0gR2VucmUpICsgDQogICAgICAgICAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKw0KICAgICAgICAgICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3Q9MC45NSwgdmp1c3Q9MC4yKSkrDQogICAgICAgICAgICB5bGFiKCJOdW1iZXIgb2YgR2FtZXMgUmVsZWFzZWQiKQ0KDQogICAgICAgIHJldHVybiAoZ2dwbG90bHkoZ3JhcGgyKSkNCiAgICB9DQpgYGANCg0KYGBge3J9DQpmaWx0ZXJfcmVnaW9uID0gbGlzdCgiSlBfU2FsZXMiKQ0KZmlsdGVyX3BsYXQgPSBsaXN0KCJONjQiKQ0KZmlsdGVyX2dlbiA9IHVuaXF1ZShnYW1lX21lbHQkR2VucmUpDQpmaWx0ZXJfcHViID0gdW5pcXVlKGdhbWVfbWVsdCRQdWJsaXNoZXIpDQptaW5feWVhciA9IDE5ODANCm1heF95ZWFyID0gMTk5MA0KdGVzdCA8LSBnYW1lX21lbHQgJT4lIA0KICAgIHN1YnNldChSZWdpb24gJWluJSBmaWx0ZXJfcmVnaW9uICYgUGxhdGZvcm0gJWluJSBmaWx0ZXJfcGxhdCAmIEdlbnJlICVpbiUgZmlsdGVyX2dlbiAmIFB1Ymxpc2hlciAlaW4lIGZpbHRlcl9wdWIgJiBZZWFyID49IG1pbl95ZWFyICYgWWVhciA8PSBtYXhfeWVhcikNCmRpbSh0ZXN0KQ0KYGBgDQpgYGB7cn0NCnggPC0gZ2FtZV9tZWx0ICU+JSAjSW5pdGlhbGl6ZSBUb3AgR2VucmUgQ2FyZCAoVGFiMykNCiAgICBncm91cF9ieShHZW5yZSkgJT4lDQogICAgc3VtbWFyaXNlKCJDb3BpZXMgU29sZCIgPSBzdW0oYENvcGllcyBTb2xkYCkpICU+JQ0KICAgIHN1YnNldChgQ29waWVzIFNvbGRgPT0gbWF4KGBDb3BpZXMgU29sZGApKQ0KeFsxXQ0KYGBgDQoNCg0KDQoNCg==